import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Line2D;
import java.text.*;
import java.util.ArrayList;
import javax.swing.*;

@SuppressWarnings("serial")
public class Vektorid extends JPanel implements ActionListener {
	JMenuBar menubar;
	JMenu esimene_Menu, teine_Menu, kolmas_Menu;
	JMenuItem item;
	ArrayList<JCheckBoxMenuItem> cbMenuItem = new ArrayList<JCheckBoxMenuItem>();
	JPanel ylemine;
	KeskPaneel keskmine;
	JButton tagasi, liida, zuum_sisse_nupp, zuum_valja_nupp, eelmine_samm, jargmine_samm, vaata_lahendust;
	VektorKogum vektorikogu, liituvate_vektorite_kogu;
	Vektor uus_vektor;
	Vektor vektorite_liitmise_tulemus;
	Timer taimer, liidetud_vektori_timer;
	Boolean naita_vektorite_liitmist= false, naita_lypp_liidetavat = false, pane_liidetud_tulemus_vilkuma=true;
	Ylesannete_kogu fyysika_ylesanded;
	int display_mode = 0, time=0, zoomSize = 50, parajasti_liidetav_vektor=1, time_liidetav_vektor=1;

	public Vektorid() {
		setLayout(new BorderLayout(3, 3));
		ylemine = new JPanel();
		ylemine.setLayout(new FlowLayout(FlowLayout.LEFT));
		tagasi = new JButton("<< TAGASI");
		tagasi.addActionListener(this);
		ylemine.add(tagasi);
		ylemine.setBorder(BorderFactory.createEtchedBorder());
		vektorikogu = new VektorKogum();
		ylemine.add(getMenuBar());
		add(ylemine, BorderLayout.NORTH);
		fyysika_ylesanded = new Ylesannete_kogu(2);
		yl_nupud_nahtamatuks();
		keskmine = new KeskPaneel();
		keskmine.setLayout(new BorderLayout());
		add(keskmine, BorderLayout.CENTER);
		taimer = new Timer(40, new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				time += 1;
				// if (time > 100) taimer.stop();
				repaint();
			}
		});
		liidetud_vektori_timer = new Timer(300, new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				 time_liidetav_vektor += 1;
				if (time_liidetav_vektor > 9) liidetud_vektori_timer.stop();
				if (naita_lypp_liidetavat) {
					naita_lypp_liidetavat = false;
				} else {
					naita_lypp_liidetavat = true;
				}
				repaint();
			}
		});
	}

	private void yl_nupud_nahtavaks() {
		eelmine_samm.setVisible(true);
		jargmine_samm.setVisible(true);
		vaata_lahendust.setVisible(true);
		kontrolli_ylesannete_nuppude_staatust();
	}

	private void yl_nupud_nahtamatuks() {
		eelmine_samm.setVisible(false);
		jargmine_samm.setVisible(false);
		vaata_lahendust.setVisible(false);
	}

	private class KeskPaneel extends JPanel implements MouseListener, MouseMotionListener {
		int x1, y1, x2, y2, noolepikkus = 15;
		NumberFormat nf = new DecimalFormat("#00.00");
		boolean joonistame_uut_vektorit = false;

		KeskPaneel() {
			x1 = y1 = 59;
			x2 = 100;
			y2 = 199;
			// setPreferredSize(new Dimension(100,100));
			// setBackground(Color.WHITE);
			this.addMouseListener(this);
			this.addMouseMotionListener(this);
		}

		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			switch (display_mode) {
				case 0:
					display_vektorid (g);
					break;
				case 1:
					display_ylesanne (g);
					break;
				default: 
					System.out.println("Undefined display mode");
			}
		}

		private void display_ylesanne (Graphics g) {
			zuum_valja_nupp.setVisible(true);
			zuum_sisse_nupp.setVisible(true);
			int strHeight; //height of the string.
			Color display;
			String display_string;
			Ylesanne ylesanne = new Ylesanne(0);
			ylesanne = fyysika_ylesanded.otsi_ylesanne_nr(fyysika_ylesanded.getActive_ylesanne());
			ArrayList <String> stringid  = new ArrayList <String> ();
			Font bigBoldFont = new Font("Arial Unicode MS", Font.BOLD, zoomSize/2);
			g.setFont(bigBoldFont);
			FontMetrics fm = g.getFontMetrics(bigBoldFont);
			strHeight = fm.getAscent();
			display = Color.black;
			g.setColor(display);
			display_string = ylesanne.getTekst();
			int reacounter = 0;
			stringid= poolita_string(g, display_string, bigBoldFont);
			for (int i = 0; i < stringid.size();i++) {
				g.drawString(stringid.get(i), 10, strHeight +  strHeight * reacounter++);
			}
			for (int i = 1; i < ylesanne.getActive_step_nr() + 1; i++) {
				Ylesande_step current_step = ylesanne.stepid.get(i-1);
				display_string = current_step.getVihje();
				display = new Color(0, 99, 0); // DarkSeaGreen;
				g.setColor(display);
				
				stringid= poolita_string(g, display_string, bigBoldFont);
				for (int z = 0; z < stringid.size();z++) {
					g.drawString(stringid.get(z), 30, strHeight +  strHeight * reacounter++);
				}
				if (current_step.isNaita_lahendust()) {
					display = new Color(65, 105, 225);
					g.setColor(display);
					display_string = current_step.getStepi_lahendus();	
					stringid= poolita_string(g, display_string, bigBoldFont);
					for (int z = 0; z < stringid.size();z++) {
						g.drawString(stringid.get(z), 30, strHeight +  strHeight * reacounter++);
					}
				}
			}
		}

		private void display_vektorid(Graphics g) {
			zuum_valja_nupp.setVisible(false);
			zuum_sisse_nupp.setVisible(false);
			Graphics2D g2 = (Graphics2D) g;
			int width = this.getWidth(), height = this.getHeight(), keskkoht_x = width / 2, keskkoht_y = height / 2;
			int vektori_nr = 0;
			BasicStroke line3 = new BasicStroke(2);
			g2.setStroke(line3);
			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
			g2.setColor(new Color(0, 0, 150));
			g2.drawLine(keskkoht_x, 0, keskkoht_x, height); // y telje joon
			g2.drawString("Y", keskkoht_x + 20, 20);
			g2.drawLine(0, keskkoht_y, width, keskkoht_y); // x telje joon
			g2.drawString("X", width - 20, keskkoht_y - 20);
			g2.setStroke(new BasicStroke(2));
			
			if (naita_vektorite_liitmist) {
				// System.out.println("Liitmine laks käima");
				for (vektori_nr = 0; vektori_nr < liituvate_vektorite_kogu.size() ; vektori_nr++) { // vektorid ArrayList -ist
					// System.out.println("Vektor nr=" + vektori_nr + "Vektorikogu.size=" + vektorikogu.size());
					Vektor vektor = liituvate_vektorite_kogu.get(vektori_nr);
				
					if (vektori_nr == parajasti_liidetav_vektor) {
						Vektor vektor_mis_on_aluseks = vektorikogu.get(vektori_nr); // selle vektori võtame kogu aeg originaalses positsioonis
						// nihutame siis seda vektorit mida on vaja liita sinna eelmise vektori noole otsa
						// System.out.println("Vektor ENNE x1:" + vektor.getX_alg() + " x2:" + vektor.getX_lypp() + " y1:"+vektor.getY_alg()+ " y2:" + vektor.getX_lypp());
						Vektor eelmine = liituvate_vektorite_kogu.get(vektori_nr - 1);	
						// System.out.println("Eelmine x2:" + eelmine.getX_lypp() + " y2:" + eelmine.getY_lypp());
								
						double temp_x_algus = arvuta_koordinaat(vektor_mis_on_aluseks.getX_alg(), eelmine.getX_lypp());
						double temp_y_algus = arvuta_koordinaat(vektor_mis_on_aluseks.getY_alg(), eelmine.getY_lypp());
						double vahe_x = vektor_mis_on_aluseks.getX_alg() - temp_x_algus;
						double vahe_y = vektor_mis_on_aluseks.getY_alg() - temp_y_algus;
						double temp_x_lopp = vektor_mis_on_aluseks.getX_lypp() - vahe_x;
						double temp_y_lopp = vektor_mis_on_aluseks.getY_lypp() - vahe_y;
						
						/*
						double temp_x_lopp = arvuta_koordinaat( vektor_mis_on_aluseks.getX_lypp(), (vektor_mis_on_aluseks.getX_lypp() - vahe_x));
						double temp_y_lopp = arvuta_koordinaat( vektor_mis_on_aluseks.getY_lypp(), (vektor_mis_on_aluseks.getY_lypp() - vahe_y));
						*/

						vektor.setX_alg(temp_x_algus);
						vektor.setY_alg(temp_y_algus);
						vektor.setX_lypp(temp_x_lopp);
						vektor.setY_lypp(temp_y_lopp);
						
						// System.out.println("Vektor PÄRAST x1:" + vektor.getX_alg() + " x2:" + vektor.getX_lypp() + " y1:"+vektor.getY_alg()+ " y2:" + vektor.getX_lypp());
						// g2.drawLine(temp_x_algus, temp_y_algus, temp_x_lopp, temp_y_lopp);
						
						if ((int) vektor.getX_alg()== (int) eelmine.getX_lypp() && (int) vektor.getY_alg()== (int) eelmine.getY_lypp()) {
							if (vektori_nr==(liituvate_vektorite_kogu.size()-1)) {
								// Viimane vektor edukalt liidetud 
								// System.out.println("Viimane vektor edukalt liidetud");
								// siin tõmbame esimese vektori ja viimase vahele joone
								taimer.stop();
								
								Vektor esimene_vektor = liituvate_vektorite_kogu.get(0);
								vektorite_liitmise_tulemus = new Vektor (esimene_vektor.getX_alg(), esimene_vektor.getY_alg(), vektor.getX_lypp(),vektor.getY_lypp());	
								
								for (int j = 0; j < liituvate_vektorite_kogu.size() ;j++) {
									Vektor nimedoonor = liituvate_vektorite_kogu.get(j);
									if (j==0) {
										vektorite_liitmise_tulemus.nimi = 	vektorite_liitmise_tulemus.nimi + nimedoonor.nimi;
									} else {
										vektorite_liitmise_tulemus.nimi = 	vektorite_liitmise_tulemus.nimi + "+" + nimedoonor.nimi;
									}
								
								}
								if (pane_liidetud_tulemus_vilkuma) {
									pane_liidetud_tulemus_vilkuma=false;
									liidetud_vektori_timer.start();
								}
							} else {
								// System.out.println("Liidame järgmise vektori, vektori_nr:" + + vektori_nr + " liituvate_vektorite_kogu.size():" + liituvate_vektorite_kogu.size());
								parajasti_liidetav_vektor++;
								time=1;
							}
							
						} // end if (vektor.getX_alg()== eelmine.getX_lypp() && vektor.getY_alg()== eelmine.getY_lypp()) {
					} // end if (vektori_nr == parajasti_liidetav_vektor) {
					
					g2.setColor(tagasta_varv(vektori_nr));
					joonesta_vektor(g2, vektor);
					
					if (naita_lypp_liidetavat) {
						g2.setColor(Color.BLUE);
						joonesta_vektor(g2, vektorite_liitmise_tulemus);
					}
				}
				
			} else {
				for (vektori_nr = 0; vektori_nr < vektorikogu.size() ; vektori_nr++) { // vektorid ArrayList -ist
					// System.out.println("Vektor nr=" + vektori_nr + "Vektorikogu.size=" + vektorikogu.size());
					Vektor vektor = vektorikogu.get(vektori_nr);
					g2.setColor(tagasta_varv(vektori_nr));
					joonesta_vektor(g2, vektor);
					
				} // end for (vektori_nr = 0; vektori_nr < vektorikogu.size() ; vektori_nr++) {
				g2.setColor(tagasta_varv(vektori_nr));
				
				if (joonistame_uut_vektorit) {
					double pikkus = Math.sqrt(Math.pow(x2-x1, 2) + Math.pow(y2-y1, 2)); // vektori pikkus 
					g2.drawString("||" + nf.format(pikkus) +"||", x2, y2-15);
					g2.drawLine(x1, y1, x2, y2);
					joonesta_nool(g2,x2, y2, x1, y1);
				} // end if (joonistame_uut_vektorit) {
				
			} // end else if (taimer.isRunning()) {
			
			// g2.setColor(Color.RED);
			// joonesta_nool(g2, x2, y2, x1, y1);

			// g2.setColor(Color.black);
			// g2.drawLine(130, 130, 191, 150); // vektor
			
			/*
			int temp_x_algus = arvuta_koordinaat(x1, 191);
			int temp_y_algus = arvuta_koordinaat(y1, 150);
			int temp_x_lopp = arvuta_koordinaat(x2, 191 + x2 - x1);
			int temp_y_lopp = arvuta_koordinaat(y2, 150 + y2 - y1);
			g2.drawLine(temp_x_algus, temp_y_algus, temp_x_lopp, temp_y_lopp);
			joonesta_nool(g2, temp_x_lopp, temp_y_lopp, temp_x_algus, temp_y_algus);

			if (time > 100) {
				g2.setColor(Color.BLUE);
				g2.drawLine(130, 130, temp_x_lopp, temp_y_lopp);
			}
			*/
		}
		
		public void joonesta_vektor(Graphics2D g2, Vektor vektor) {
			g2.drawLine((int) vektor.getX_alg(), (int) vektor.getY_alg(), (int) vektor.getX_lypp(), (int) vektor.getY_lypp());
			joonesta_nool(g2, (int) vektor.getX_lypp(), (int) vektor.getY_lypp(),(int) vektor.getX_alg(),(int) vektor.getY_alg());
			g2.setColor(Color.black);
			g2.drawString(vektor.nimi, (int) vektor.keskmine_x_pos(), (int) vektor.keskmine_y_pos());
		}
		
		public void joonesta_nool (Graphics2D g2, int nooleots_x, int nooleots_y, int vektor_algus_x, int vektor_algus_y) {
			double dx = nooleots_x - vektor_algus_x, dy = nooleots_y - vektor_algus_y;
			double phi = Math.PI / 9;  // phi on noole ja vektori vaheline nurk
			double theta = Math.atan2(dy, dx), x, y, rho = theta + phi;
			for (int j = 0; j < 2; j++) {
				x = nooleots_x - noolepikkus * Math.cos(rho);
				y = nooleots_y - noolepikkus * Math.sin(rho);
				g2.draw(new Line2D.Double(nooleots_x, nooleots_y, x, y));
				rho = theta - phi;
			}
		}
		
		public double arvuta_koordinaat (double algus, double lypp) {
			double teepikkus = lypp -  algus;
			teepikkus = teepikkus / 100 * time;
			return (algus + teepikkus);
		}
		
		public ArrayList <String> poolita_string(Graphics g, String display_string, Font bigBoldFont) {
			int strWidth;
			FontMetrics fm = g.getFontMetrics(bigBoldFont);
			strWidth = fm.stringWidth(display_string); 
			ArrayList <String> stringid  = new ArrayList <String> ();	
			if (strWidth > this.getWidth()) { 				
				   // on vaja poolitada
				while (fm.stringWidth(display_string) > (this.getWidth() - this.getWidth()/10)) {
					strWidth = fm.stringWidth(display_string);
					int char_arv = display_string.length();
					int yhe_tahe_suurus=strWidth / char_arv;
					int fromIndex = (int) (this.getWidth() - this.getWidth() / 4.2) / yhe_tahe_suurus; 
					int poolita_kohal = display_string.indexOf(" ", fromIndex);
					if (poolita_kohal < 0) {
						break;
					}
					stringid.add(display_string.substring(0, poolita_kohal));
					display_string = display_string.substring(poolita_kohal, char_arv);
				}
			}
			stringid.add(display_string);
			return stringid;
		}

		@Override
		public void mousePressed(MouseEvent e) {
			naita_vektorite_liitmist= false;
			joonistame_uut_vektorit = true;
			x1 = e.getX();
			x2 = e.getX();
			y1 = e.getY();
			y2 = e.getY();
			repaint();
		}
		@Override
		public void mouseDragged(MouseEvent e) {
			x2 = e.getX();
			y2 = e.getY();
			if (joonistame_uut_vektorit) {
				repaint();
			}
			
		}
		@Override
		public void mouseReleased(MouseEvent e) {
			// kas eksisteerib 0 pikkusega vektoreid? igaks juhuks ei lase neid joonistada
			if (x1==x2 && y1==y2) {
				System.out.println("Null pikkusega vektor");
			} else {
				uus_vektor = new Vektor (x1, y1, x2, y2);
				vektorikogu.add_vektor(uus_vektor);
				joonistame_uut_vektorit = false;
				
			}
			repaint();
			teine_Menu.removeAll();
			cbMenuItem.clear();
			for (int i = 0; i < vektorikogu.size() ; i++) {
				cbMenuItem.add(new JCheckBoxMenuItem("Vektor " + (i+1)));
				cbMenuItem.get(i).setSelected(true);
				cbMenuItem.get(i).addActionListener(new Vektorid());
				teine_Menu.add(cbMenuItem.get(i));
			}
		}
		@Override
		public void mouseMoved(MouseEvent e) { }
		@Override
		public void mouseClicked(MouseEvent e) { }
		@Override
		public void mouseEntered(MouseEvent e) { }
		@Override
		public void mouseExited(MouseEvent e) { }

	} // end class KeskPaneel

	public Color tagasta_varv(int varv_nr) {
		Color display = Color.GREEN;

		if (varv_nr == 0)
			display = new Color(189, 183, 107); // DarkKhaki
		if (varv_nr == 1)
			display = new Color(255, 140, 0); // DarkOrange
		if (varv_nr == 2)
			display = new Color(205, 92, 92); // IndianRed
		if (varv_nr == 3)
			display = new Color(0, 255, 0); // Green
		if (varv_nr == 4)
			display = new Color(255, 105, 180); // HotPink
		if (varv_nr == 5)
			display = new Color(255, 20, 147); // DeepPink
		if (varv_nr == 6)
			display = new Color(255, 127, 80); // Coral
		if (varv_nr == 7)
			display = new Color(218, 165, 32); // Goldenrod
		if (varv_nr == 8)
			display = new Color(255, 69, 0); // OrangeRed
		if (varv_nr == 9)
			display = new Color(250, 128, 114); // Salmon
		if (varv_nr == 10)
			display = new Color(255, 215, 0); // Gold
		if (varv_nr == 11)
			display = new Color(255, 0, 0); // Red
		if (varv_nr == 12)
			display = new Color(240, 230, 140); // Khaki
		if (varv_nr == 13)
			display = new Color(230, 230, 250); // Lavender
		if (varv_nr == 14)
			display = new Color(238, 130, 238); // Violet
		if (varv_nr == 15)
			display = new Color(153, 102, 204); // Amethyst
		if (varv_nr == 16)
			display = new Color(106, 90, 205); // SlateBlue
		if (varv_nr == 17)
			display = new Color(152, 251, 152); // PaleGreen
		if (varv_nr == 18)
			display = new Color(154, 205, 50); // YellowGreen
		if (varv_nr == 19)
			display = new Color(143, 188, 143); // DarkSeaGreen
		if (varv_nr == 20)
			display = new Color(192, 192, 192); // Silver
		if (varv_nr == 21)
			display = new Color(210, 105, 30); // Chocolate
		if (varv_nr == 22)
			display = new Color(160, 82, 45); // Sienna
		if (varv_nr == 23)
			display = new Color(65, 105, 225); // RoyalBlue
		if (varv_nr == 24)
			display = new Color(127, 255, 212); // Aquamarine

		return display;
	}

	private class VektorKogum {
		ArrayList<Vektor> vektorid = new ArrayList<Vektor>();
		private String alphabet = "ABCDEFGHIJKLMNOPRSTUWXYZ";

		public void add_vektor(Vektor vektor) {
			int mitmes = this.vektorid.size();
			
			if (mitmes >=  alphabet.length()) {
				vektor.nimi=""+mitmes;
			} else {
				vektor.nimi=""+alphabet.charAt(mitmes);
			}
			
			this.vektorid.add(vektor);
			
		}

		public int size() {
			return this.vektorid.size();
		}

		public Vektor get(int i) {
			return vektorid.get(i);
		}
		
		public VektorKogum make_copy_of_yourself() {
			VektorKogum uusVektorKogum = new VektorKogum();
			for (int i = 0; i < vektorid.size();i++) {
				Vektor uus = new Vektor();
				uus.copy_Vektor(vektorid.get(i));
				uusVektorKogum.add_vektor(uus);
			}
			
			return uusVektorKogum;
		}

	}

	private class Vektor {
		private double x_alg, y_alg, x_lypp, y_lypp;
		public String nimi="";

		Vektor() {
			set_cordinates(0, 0, 0, 0);
			// construktor
		}

		Vektor(double x_alg, double y_alg, double x_lypp, double y_lypp) {
			set_cordinates(x_alg, x_lypp, y_alg, y_lypp);
			// constructor II
		}

		Vektor(int x_alg, int y_alg, int x_lypp, int y_lypp) {
			set_cordinates(x_alg, x_lypp, y_alg, y_lypp);
			// constructor III
		}
		
		public void copy_Vektor(Vektor copytav_vektor) {
			this.setX_alg(copytav_vektor.getX_alg());
			this.setX_lypp(copytav_vektor.getX_lypp());
			this.setY_alg(copytav_vektor.getY_alg());
			this.setY_lypp(copytav_vektor.getY_lypp());
			this.nimi=copytav_vektor.nimi;
		}

		public void set_cordinates(double x_alg, double x_lypp, double y_alg, double y_lypp) {
			this.setX_alg(x_alg);
			this.setX_lypp(x_lypp);
			this.setY_alg(y_alg);
			this.setY_lypp(y_lypp);
		}
		
		public double keskmine_x_pos() {
			return (int)((this.getX_alg()+this.getX_lypp())/2);
		}
		
		public double keskmine_y_pos() {
			return (int)((this.getY_alg()+this.getY_lypp())/2);
		}
		
		public void setX_alg(double x_alg) {
			this.x_alg = x_alg;
		}

		public double getX_alg() {
			return x_alg;
		}

		public void setY_alg(double y_alg) {
			this.y_alg = y_alg;
		}

		public double getY_alg() {
			return y_alg;
		}

		public void setX_lypp(double x_lypp) {
			this.x_lypp = x_lypp;
		}

		public double getX_lypp() {
			return x_lypp;
		}

		public void setY_lypp(double y_lypp) {
			this.y_lypp = y_lypp;
		}

		public double getY_lypp() {
			return y_lypp;
		}
	}

	public JMenuBar getMenuBar() {
		menubar = new JMenuBar();
		esimene_Menu = new JMenu("Vektorid");
		teine_Menu = new JMenu("Vektorid");
		kolmas_Menu = new JMenu("Ülesanne");
		menubar.add(esimene_Menu);
		menubar.add(teine_Menu);
		menubar.add(kolmas_Menu);
		zuum_sisse_nupp = new JButton("Zoom +");
		zuum_sisse_nupp.addActionListener(this);
		menubar.add(zuum_sisse_nupp);
		zuum_valja_nupp = new JButton("Zoom -");
		zuum_valja_nupp.addActionListener(this);
		menubar.add(zuum_valja_nupp);
		eelmine_samm = new JButton("Eelmine samm");
		eelmine_samm.addActionListener(this);
		jargmine_samm = new JButton("Jargmine samm");
		jargmine_samm.addActionListener(this);
		vaata_lahendust = new JButton("Vaata lahendust");
		vaata_lahendust.addActionListener(this);
		menubar.add(eelmine_samm);
		menubar.add(jargmine_samm);
		menubar.add(vaata_lahendust);

		item = new JMenuItem("Vektorid");
		item.addActionListener(this);
		esimene_Menu.add(item);
		item = new JMenuItem("Liida vektorid");
		item.addActionListener(this);
		esimene_Menu.add(item);

		item = new JMenuItem("Ülesanne 3");
		item.addActionListener(this);
		kolmas_Menu.add(item);
		item = new JMenuItem("item_2");
		item.addActionListener(this);
		kolmas_Menu.add(item);

		return menubar;
	}

	public void zoom_in() {
		zoomSize = zoomSize + (int) Math.max(zoomSize * 0.5, 1);
		zuum_valja_nupp.setEnabled(true);
		if (zoomSize > 300) {
			zuum_sisse_nupp.setEnabled(false);
		}
	}

	public void zoom_out() {
		zoomSize = (int) (zoomSize * 0.7);
		zuum_sisse_nupp.setEnabled(true);
		if (zoomSize < 6) {
			zuum_valja_nupp.setEnabled(false);
		}
	}

	private void kontrolli_ylesannete_nuppude_staatust() {
		Ylesanne ylesanne = fyysika_ylesanded.otsi_ylesanne_nr(fyysika_ylesanded.getActive_ylesanne()); 

		eelmine_samm.setEnabled(true);
		jargmine_samm.setEnabled(true);
		vaata_lahendust.setEnabled(true);

		if (ylesanne.getActive_step_nr()==0) {
			eelmine_samm.setEnabled(false);
			vaata_lahendust.setEnabled(false);	
		}
		if (ylesanne.getActive_step_nr()==ylesanne.stepid.size()) {
			jargmine_samm.setEnabled(false);
		}

		if (ylesanne.getActive_step_nr() > 0) {
			Ylesande_step current_step = ylesanne.stepid.get(ylesanne.getActive_step_nr() - 1);
			if (current_step.isNaita_lahendust()) {
				vaata_lahendust.setEnabled(false);	
			}
		}
	}

	private void eelmine_samm() {
		Ylesanne ylesanne = fyysika_ylesanded.otsi_ylesanne_nr(fyysika_ylesanded.getActive_ylesanne()); 
		if (ylesanne.getActive_step_nr() > 0) ylesanne.setActive_step_nr(ylesanne.getActive_step_nr()-1);
		kontrolli_ylesannete_nuppude_staatust();
	}
	
	private void jargmine_samm() {
		Ylesanne ylesanne = fyysika_ylesanded.otsi_ylesanne_nr(fyysika_ylesanded.getActive_ylesanne()); 
		if (ylesanne.getActive_step_nr() < ylesanne.stepid.size()) 
			ylesanne.setActive_step_nr(ylesanne.getActive_step_nr() + 1);
		kontrolli_ylesannete_nuppude_staatust();
	}

	private void vaata_lahendust() {
		Ylesanne ylesanne = fyysika_ylesanded.otsi_ylesanne_nr(fyysika_ylesanded.getActive_ylesanne()); 
		if (ylesanne.getActive_step_nr() > 0) {
			Ylesande_step current_step = ylesanne.stepid.get(ylesanne.getActive_step_nr() - 1);
			current_step.setNaita_lahendust(true);
		}
		kontrolli_ylesannete_nuppude_staatust();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		String command = e.getActionCommand();
		if (command.equals("<< TAGASI")) {
			this.setVisible(false);
		}
		if (command.equals("Liida vektorid")) {
			display_mode = 0;
			yl_nupud_nahtamatuks();
			liituvate_vektorite_kogu = vektorikogu.make_copy_of_yourself();
			parajasti_liidetav_vektor=1;
			naita_vektorite_liitmist= true;
			pane_liidetud_tulemus_vilkuma=true;
			naita_lypp_liidetavat = false;
			time=1;
			taimer.start();
		}
		if (command.equals("Ülesanne 3")) {
			yl_nupud_nahtavaks();
			fyysika_ylesanded.setActive_ylesanne(0);
			display_mode=1;
		}
		if (command.equals("Vektorid")) {
			display_mode = 0;
			yl_nupud_nahtamatuks();
		}
		if (command.equals("Zoom +")) {
			zoom_in();
		}
		if (command.equals("Zoom -")) {
			zoom_out();
		}
		if (command.equals("Eelmine samm")) {
			eelmine_samm();
		}
		if (command.equals("Jargmine samm")) {
			jargmine_samm();
		}
		if (command.equals("Vaata lahendust")) {
			vaata_lahendust();
		}
		super.repaint();
	}
}
